/**
 * @projectName leetode
 * @package cn.leetcode
 * @className cn.leetcode.t501
 * @copyright Copyright 2020 Thunisoft, Inc All rights reserved.
 */
package cn.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * t501
 * @description
 * @author fei
 * @date 2025/9/12 13:44
 * @version 1.0
 */
/*
给你一个含重复值的二叉搜索树（BST）的根节点 root ，找出并返回 BST 中的所有 众数（即，出现频率最高的元素）。

如果树中有不止一个众数，可以按 任意顺序 返回。

假定 BST 满足如下定义：

结点左子树中所含节点的值 小于等于 当前节点的值
结点右子树中所含节点的值 大于等于 当前节点的值
左子树和右子树都是二叉搜索树
示例 1：

输入：root = [1,null,2,2]
输出：[2]
示例 2：

输入：root = [0]
输出：[0]
 */
public class t501 {
    private int maxCount;
    private int curCount;
    private TreeNode pre;
    List<Integer> ans;

    public int[] findMode(TreeNode root) {
        maxCount = 0;
        curCount = 0;
        ans = new ArrayList<>();
        getMode(root);
        int[] res = new int[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            res[i] = ans.get(i);
        }
        return res;
    }

    public void getMode(TreeNode root) {
        if (root == null) {
            return;
        }
        getMode(root.left);
        int rootVal = root.val;
        if (pre == null || pre.val != rootVal) {
            curCount = 1;
        } else {
            curCount++;
        }
        if (curCount > maxCount) {
            maxCount = curCount;
            ans.clear();
            ans.add(rootVal);
        }else if (curCount == maxCount){
            ans.add(rootVal);
        }
        pre = root;
        getMode(root.right);
    }
}
